﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>组件对象数组 - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The 组件对象数组 function creates a SafeArray 遍历 use with COM." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>组件对象数组</h1>

<p>创建用于 COM 的安全数组.</p>

<pre class="Syntax">ArrayObj := <span class="func">组件对象数组</span>(VarType, Count1 <span class="optional">, Count2, ... Count8</span>)</pre>

<h2 id="Parameters">参数</h2>
<dl>

  <dt>VarType</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#numbers">整数</a></p>
    数组的基类型(数组中每个元素的 VARTYPE). VARTYPE 被限制为<a href="ComObjType.htm#vt">变体类型</a>的子集. 不能设置为 VT_ARRAY 或 the VT_BYREF 标志. VT_EMPTY 和 VT_NULL 不是数组的有效基类型. 其他所有类型是合法的.
    <p>有关可用值的列表, 请参阅 <a href="ComObjType.htm">组件对象类型</a>.</p>
  </dd>

  <dt>Count<i>N</i></dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#numbers">整数</a></p>
    <p>每个维度的大小. 支持最多 8 维的数组.</p>
  </dd>

</dl>

<h2 id="Return_Value">返回值</h2>
<p>类型: <a href="../Concepts.htm#objects">对象</a></p>
<p>函数返回一个新的包含安全数组的包装器对象的<a href="../Concepts.htm#references-to-objects">引用</a>, 数组包装器对象支持下列方法:</p>
<ul>
    <li><code>.MaxIndex(n)</code>: 返回第 <i>n</i> 维的上界. 如果 <i>n</i> 省略, 默认为 1.</li>
    <li><code>.MinIndex(n)</code>: 返回第 <i>n</i> 维的下界. 如果 <i>n</i> 省略, 默认为 1.</li>
    <li><code>.Clone()</code>: 返回数组的副本.</li>
    <li><code>.__Enum()</code>: 通常不由脚本调用; 允许 <a href="For.htm">遍历-loops</a> 与安全数组一起使用.</li>
</ul>

<h2 id="Remarks">备注</h2>
<p>COM 方法和 <a href="ComObject.htm">组件对象</a> 也可以返回数组包装器对象. 脚本中可以使用如下方法判断一个值是否为数组:</p>
<pre>如果 组件对象类型(<i>obj</i>) &amp; 0x2000
    信息框 "数组 subtype: " . 组件对象类型(obj) &amp; 0xfff
否则
    信息框 "Not an 数组."</pre>
<p>可以支持多达 8 维的数组.</p>
<p>由于安全数组未被设计为支持多重引用, 故当一个安全数组被赋值为另一个安全数组的元素时, 会创建一个独立的副本. 不过, 仅当包装器对象含有 F_OWNVALUE 标志时才会发生这种情况, 这个标志表示它负责销毁此数组. 此标志可用 <a href="ComObjFlags.htm">组件对象标志</a> 移除.</p>
<p>当被 COM 客户端调用的函数或方法返回一个带有 F_OWNVALUE 标志的安全数组时, 将建立并返回一个副本, 而原安全数组将自动销毁.</p>

<h2 id="Related">相关</h2>
<p><a href="ComObject.htm">组件对象</a>, <a href="ComObjType.htm">组件对象类型</a>, <a href="ComObjValue.htm">组件对象值</a>, <a href="ComObjActive.htm">组件对象激活</a>, <a href="ComObjFlags.htm">组件对象标志</a>, <a href="http://msdn.microsoft.com/en-us/library/ms221145.aspx">数组 Manipulation Functions (MSDN)</a></p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a href="#ExBasic">#1</a>: 简单示例.</p>
<pre>arr := 组件对象数组(VT_VARIANT:=12, 3)
arr[0] := "Auto"
arr[1] := "Hot"
arr[2] := "key"
t := ""
循环 arr.MaxIndex() + 1
    t .= arr[内_循环次数-1]
信息框 t
</pre>
</div>

<div class="ex" id="ExMultiDims">
<p><a href="#ExMultiDims">#2</a>: 多维数组.</p>
<pre>arr := 组件对象数组(VT_VARIANT:=12, 3, 4)

<em>; 获取数组的维数:</em>
dim := 动态库调用("oleaut32\SafeArrayGetDim", "ptr", 组件对象值(arr))

<em>; 得到每个维度的边界:</em>
dims := ""
循环 dim
    dims .= arr.MinIndex(内_循环次数) " .. " arr.MaxIndex(内_循环次数) "`n"
信息框 dims

<em>; 简单用法:</em>
循环 3 {
    x := 内_循环次数-1
    循环 4 {
        y := 内_循环次数-1
        arr[x, y] := x * y
    }
}
信息框 arr[2, 3]
</pre>
</div>

</body>
</html>